#!/bin/bash
set -e
if [ -z "${MountPoint}" ]; then
    EnvFile="../common/0_env.sh"
    # shellcheck source=../common/0_env.sh
    source ${EnvFile}
fi

echo -e "\n***********************************************************************"
echo -e "\t\t$0 : 测试在空配额目录写文件"
echo -e "***********************************************************************"

tmp_dir="/test_write_emptydir"
abs_tmp_dir="${MountPoint}${tmp_dir}"
abs_tmp_file="${abs_tmp_dir}/tmpfile"

function init_dir()
{
    mkdir -p ${abs_tmp_dir}
    clean_dir ${abs_tmp_dir}
    orcafs-ctl --setpattern --storagepoolid=2 "${abs_tmp_dir}" &> /dev/null
    chown -R root:root ${abs_tmp_dir}
    remove_all_quota_for_dir ${tmp_dir}
}

function test_no_quota()
{
    echo -e "\n------测试没有配额时写文件------"

    print3s "创建并写文件"
    test_cmd "echo aaa > ${abs_tmp_file}"

    print3s "删除文件"
    exec_tree -s ${abs_tmp_dir}
    test_cmd "rm -f ${abs_tmp_file}"
    
    clean_dir ${abs_tmp_dir}
}

function test_write_newfile()
{
    echo -e "\n------测试普通配额目录：在空目录创建新文件并写入数据------"
    create_quota ${tmp_dir} "--hardsize=1000" "--hardnum=1000"

print3s "写新文件但是 <不超出> 配额"
    bs_size=$((1 * 500))
    test_cmd "dd if=/dev/zero of=${abs_tmp_file} bs=${bs_size} count=1 2>/dev/null"
    exec_tree -s ${abs_tmp_dir}
    sleep_check_usedsize_and_usednum ${tmp_dir}

    test_cmd "rm -f ${abs_tmp_file}"
    sleep_check_usedsize_and_usednum ${tmp_dir}
    
print3s "写新文件但是 <超出> 配额"
    bs_size=$((1 * 5000))
    test_error_cmd "dd if=/dev/zero of=${abs_tmp_file} bs=${bs_size} count=1"
    sleep_check_usedsize_and_usednum ${tmp_dir}

    clean_dir ${abs_tmp_dir}
    remove_quota_dir ${tmp_dir}
}

function test_write_with_truncate()
{
    echo -e "\n------测试普通配额目录：在空目录创建新文件并写入数据, 然后截断后覆盖写------"
    create_quota ${tmp_dir} "--hardsize=1000" "--hardnum=1000"

print3s "新建文件并写入数据"
    bs_size=$((1 * 200))
    test_cmd "dd if=/dev/zero of=${abs_tmp_file} bs=${bs_size} count=1 2>/dev/null"
    sleep_check_usedsize_and_usednum ${tmp_dir}

print3s "覆盖写但是 <不超出> 配额"
    bs_size=$((1 * 500))
    test_cmd "dd if=/dev/zero of=${abs_tmp_file} bs=${bs_size} count=1 2>/dev/null"
    exec_tree -s ${abs_tmp_dir}
    sleep_check_usedsize_and_usednum ${tmp_dir}

    test_cmd "rm -f ${abs_tmp_file}"
    sleep_check_usedsize_and_usednum ${tmp_dir}
    
print3s "写新文件但是 <超出> 配额"
    bs_size=$((1 * 2000))
    test_error_cmd "dd if=/dev/zero of=${abs_tmp_file} bs=${bs_size} count=1"
    sleep_check_usedsize_and_usednum ${tmp_dir}
    clean_dir ${abs_tmp_dir}
    remove_quota_dir ${tmp_dir}
}

function test_write_with_append()
{
    echo -e "\n------测试普通配额目录：在空目录创建新文件并写入数据, 然后追加写------"
    create_quota ${tmp_dir} "--hardsize=1000" "--hardnum=1000"

print3s "新建文件并写入数据"
    bs_size=$((1 * 200))
    test_cmd "dd if=/dev/zero of=${abs_tmp_file} bs=${bs_size} count=1 2>/dev/null"
    sleep_check_usedsize_and_usednum ${tmp_dir}

print3s "追加写但是 <不超出> 配额"
    bs_size=$((1 * 500))
    test_cmd "dd if=/dev/zero of=${abs_tmp_file} bs=${bs_size} count=1 oflag=append conv=notrunc 2>/dev/null"
    exec_tree -s ${abs_tmp_dir}
    sleep_check_usedsize_and_usednum ${tmp_dir}
    
print3s "写新文件但是 <超出> 配额"
    bs_size=$((1 * 400))
    test_error_cmd "dd if=/dev/zero of=${abs_tmp_file} bs=${bs_size} oflag=append conv=notrunc count=1"
    sleep_check_usedsize_and_usednum ${tmp_dir}
    clean_dir ${abs_tmp_dir}
    remove_quota_dir ${tmp_dir}
}

init_dir
# 测试没有配额时 hardlink
test_no_quota

# 测试写新文件
test_write_newfile

# 测试覆盖旧文件写 O_TRUNC
test_write_with_truncate

# 测试追加写 O_APPEND
test_write_with_append

rm_abs_dir ${abs_tmp_dir}
